package com.projet.whattowatch.database;

import java.util.ArrayList;

import com.projet.whattowatch.objet.Avis;
import com.projet.whattowatch.objet.Cinema;
import com.projet.whattowatch.objet.Film;
import com.projet.whattowatch.objet.Humain;
import com.projet.whattowatch.objet.LibCinema;
import com.projet.whattowatch.objet.LibFilm;
import com.projet.whattowatch.objet.LibHumain;
import com.projet.whattowatch.objet.LibUtilisateur;
import com.projet.whattowatch.objet.Projection;
import com.projet.whattowatch.objet.Utilisateur;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class DataBase
{
	private SQLiteDatabase app_db;
	
	public DataBase(Context context)
	{
		DataBaseHandler adapter = new DataBaseHandler(context);
		adapter.open();
		app_db = adapter.getDatabase();
	}
	
	public void addUser(Utilisateur user)
	{
		String query = "INSERT OR REPLACE INTO User (Mail, Name, Surname, DateOfBirth, Sex, Password) VALUES ('" 
						+ user.getAdresseMail() + "', '" + user.getPrenom() + "', '" + user.getNom() + "', '" 
						+ user.getDateDeNaissance() + "', '" + user.getSex() + "', '" + user.getPassword() + "')";
		app_db.execSQL(query);
	}
	
	public void addActeurFav(Utilisateur user, Humain acteur)
	{
		String query = "INSERT OR REPLACE INTO FavoriteActors (UserActor, User, Actor) VALUES ('" + user.getPrenom().trim() 
						+ acteur.getNom().trim() + "', '" + user.getAdresseMail().trim() + "', '" 
						+ acteur.getPrenom().trim() + acteur.getNom().trim() + "')";
		app_db.execSQL(query);
	}

	public void removeActeurFav(Utilisateur user, Humain acteur)
	{
		String query = "DELETE FROM FavoriteActors WHERE UserActor = '"+ user.getPrenom().trim() 
						+ acteur.getNom().trim() + "'";
		app_db.execSQL(query);
	}
	
	public void addRealisateurFav(Utilisateur user, Humain realisateur)
	{
		String query = "INSERT OR REPLACE INTO FavoriteDirectors (UserDirector, User, Director) VALUES ('" 
						+ user.getPrenom().trim() + realisateur.getNom().trim() + "', '" + user.getAdresseMail() 
						+ "', '" + realisateur.getPrenom().trim() + realisateur.getNom().trim() + "')";
		app_db.execSQL(query);
	}

	public void removeRealisateurFav(Utilisateur user, Humain realisateur)
	{
		String query = "DELETE FROM FavoriteDirectors WHERE UserDirector = '"+ user.getPrenom().trim()
						+ realisateur.getNom().trim() + "'";
		app_db.execSQL(query);
	}
	
	public void addFilmAVoir(Utilisateur user, Film film)
	{
		String query = "INSERT OR REPLACE INTO MovieToSee (UserMovies, User, Movie) VALUES ('" + user.getPrenom() + film.getNom().trim() + "', '" + user.getAdresseMail() + "', '" + film.getNom().trim() + film.getListRealisateur().get(0).getNom().trim() + film.getDate() + "')";
		app_db.execSQL(query);
	}

	public void removeFilmAVoir(Utilisateur user, Film film)
	{
		String query = "DELETE FROM MovieToSee WHERE UserMovies = '"+ user.getPrenom() + film.getNom().trim() + "'";
		app_db.execSQL(query);
	}
	
	public void addGenreFav(Utilisateur user, String genre)
	{
		String query = "INSERT OR REPLACE INTO FavoriteGenres (UserGenre, User, Genre) VALUES ('" + user.getPrenom() 
						+ genre.trim() + "', '" + user.getAdresseMail() + "', '" + genre.trim() + "')";
		app_db.execSQL(query);
	}

	public void removeGenreFav(Utilisateur user, String genre)
	{
		String query = "DELETE FROM FavoriteGenres WHERE UserGenre = '"+ user.getPrenom() + genre.trim() + "'";
		app_db.execSQL(query);
	}
	
	public void addAvis(Utilisateur user, Film film, float rating, String comment)
	{
		String query = "INSERT OR REPLACE INTO Rating (UserMovieRating, User, Movie, Rating, Comment) VALUES ('" 
						+ user.getPrenom() + film.getNom().trim() + film.getListRealisateur().get(0).getNom().trim() 
						+ film.getDate() + rating + "', '" + user.getAdresseMail() + "', '" + film.getNom().trim() 
						+ film.getListRealisateur().get(0).getNom().trim() + film.getDate() + "', '" + rating + "', '" + comment +"')";
		app_db.execSQL(query);
	}
	
	public Object[] getAllMovieAndPerson()
	{
		LibFilm mLibFilm = new LibFilm();
		LibHumain mLibHumain = new LibHumain();
		LibUtilisateur mLibUtilisateur = new LibUtilisateur();
		Film mFilm;
		Humain acteur, realisateur;
		Utilisateur utilisateur;
		Avis avis;
		
		ArrayList<String> listFilm;
		String nom, resume, genre, imageUrlMovie, imageUrlPerson, 
				nomActeur, prenomActeur, nomRealisateur, prenomRealisateur, role, dispo3d, comment, nomUtilisateur;
		int date, duree;
		float rating;

		
		String selectAllMovie = "SELECT * FROM Movie";
		String selectMovieActeur = "SELECT Person.Name, Person.Surname, Person.Image, Role.Role FROM Movie, Role, Person WHERE "
									+ "Movie.NameDirectorYear = Role.Movie AND Role.Person = Person.NameSurname AND "
									+ "Role.Role != \"Director\" AND Movie.Name = \"";
		String selectMovieRealisateur = "SELECT Person.Name, Person.Surname, Person.Image FROM Movie, Role, Person WHERE "
										+ "Movie.NameDirectorYear = Role.Movie AND Role.Person = Person.NameSurname AND "
										+ "Role.Role = \"Director\" AND Movie.Name = \"";
		String selectMovieAvis = "SELECT Rating.User, Rating.Rating, Rating.Comment FROM Rating, Movie WHERE "
									+ "Movie.NameDirectorYear = Rating.Movie AND Movie.Name = \"";
		String selectMovieGenre = "SELECT MovieGenres.Genre FROM Movie, MovieGenres "
									+ "WHERE Movie.NameDirectorYear = MovieGenres.Movie AND Movie.Name = \"";

		String selectAllUser = "SELECT * FROM User";
		String selectActeurFav = "SELECT Person.Name, Person.Surname FROM User, FavoriteActors, Person WHERE"
								+ " FavoriteActors.Actor = Person.NameSurname AND FavoriteActors.User = User.Mail AND"
								+ " User.Mail = \"";
		String selectRealisateurFav = "SELECT Person.Name, Person.Surname FROM User, FavoriteDirectors, Person WHERE"
									+ " FavoriteDirectors.Director= Person.NameSurname AND"
									+ " FavoriteDirectors.User = User.Mail AND User.Mail = \"";
		String selectGenreFav = "SELECT FavoriteGenres.Genre FROM User, FavoriteGenres WHERE"
								+ " FavoriteGenres.User = User.Mail AND User.Mail = \"";
		String selectFilmAVoir = "SELECT Movie.Name FROM User, MovieToSee, Movie WHERE"
								+ " MovieToSee.Movie = Movie.NameDirectorYear AND MovieToSee.User = User.Mail AND"
								+ " User.Mail = \"";
		
	    
	    Cursor cursorAllMovie = app_db.rawQuery(selectAllMovie, null);
	    if (cursorAllMovie.moveToFirst())
	    {
	        do
	        {
	            ArrayList<String> listGenre = new ArrayList<String>();
	    		ArrayList<ArrayList<Object>> listActeur = new ArrayList<ArrayList<Object>>();
	    		ArrayList<Humain> listRealisateur = new ArrayList<Humain>();
	    		ArrayList<Avis> listAvis = new ArrayList<Avis>();
	    		
	            nom = cursorAllMovie.getString(1);
	            resume = cursorAllMovie.getString(5);
	            duree = cursorAllMovie.getInt(3);
	            date = cursorAllMovie.getInt(2);
	            dispo3d = cursorAllMovie.getString(4);
	            imageUrlMovie = cursorAllMovie.getString(7);

	            Cursor cursorActeur = app_db.rawQuery(selectMovieActeur + nom + "\"", null);
	            if(cursorActeur.moveToFirst())
	            	do
	            	{
	            		nomActeur = cursorActeur.getString(0);
	            		prenomActeur = cursorActeur.getString(1);
	            		imageUrlPerson = cursorActeur.getString(2);
	            		role = cursorActeur.getString(3);
	            		Humain existActeur = mLibHumain.getHumain(nomActeur + "&" + prenomActeur);
	            		if(existActeur != null)
	            		{
	            			existActeur.getListFilm().add(nom);
	            			ArrayList<Object> listExistActeur = new ArrayList <Object>();
	            			listExistActeur.add(existActeur);
	            			listExistActeur.add(role);
		            		listActeur.add(listExistActeur);
	            		}
	            		else
	            		{
	            			listFilm = new ArrayList<String>();
	        	            listFilm.add(nom);
	            			acteur = new Humain(nomActeur, prenomActeur, listFilm, true, imageUrlPerson);
	            			ArrayList<Object> listExistActeur = new ArrayList <Object>();
	            			listExistActeur.add(acteur);
	            			listExistActeur.add(role);
		            		listActeur.add(listExistActeur);
		            		mLibHumain.addHumain(acteur);
	            		}
	            	} while(cursorActeur.moveToNext());
	            cursorActeur.close();
	            
	            Cursor cursorRealisateur = app_db.rawQuery(selectMovieRealisateur + nom + "\"", null);
	            if(cursorRealisateur.moveToFirst())
	            	do
	            	{
	            		nomRealisateur = cursorRealisateur.getString(0);
	            		prenomRealisateur = cursorRealisateur.getString(1);
	            		imageUrlPerson = cursorRealisateur.getString(2);
	            		Humain existRealisateur = mLibHumain.getHumain(nomRealisateur + "&" + prenomRealisateur);
	            		if(existRealisateur != null)
	            		{
	            			existRealisateur.getListFilm().add(nom);
		            		listRealisateur.add(existRealisateur);
	            		}
	            		else
	            		{
	            			listFilm = new ArrayList<String>();
	            			listFilm.add(nom);
	            			realisateur = new Humain(nomRealisateur, prenomRealisateur, listFilm, false, imageUrlPerson);
		            		listRealisateur.add(realisateur);
		            		mLibHumain.addHumain(realisateur);
	            		}
	            	} while(cursorRealisateur.moveToNext());
	            cursorRealisateur.close();
	            
	            Cursor cursorGenre = app_db.rawQuery(selectMovieGenre + nom + "\"", null);
	            if(cursorGenre.moveToFirst())
	            	do
	            	{
	            		genre = cursorGenre.getString(0);
	            		listGenre.add(genre);
	            	} while(cursorGenre.moveToNext());
	            cursorGenre.close();
	            
	            Cursor cursorAvis = app_db.rawQuery(selectMovieAvis + nom + "\"", null);
	            if(cursorAvis.moveToFirst())
	            	do
	            	{
	            		nomUtilisateur = cursorAvis.getString(0);
	            		rating = cursorAvis.getFloat(1);
	            		comment = cursorAvis.getString(2);
	            		avis = new Avis(nomUtilisateur, rating, comment);
	            		listAvis.add(avis);
	            	} while(cursorAvis.moveToNext());
	            cursorAvis.close();
	            
	            mFilm = new Film(nom, date, duree, listActeur, listRealisateur, resume, listGenre, listAvis, dispo3d, imageUrlMovie);
	            mLibFilm.addFilm(mFilm);
	            
	        } while (cursorAllMovie.moveToNext());
	    }
	    cursorAllMovie.close();
	    
	    Cursor cursorAllUser = app_db.rawQuery(selectAllUser, null);
	    if (cursorAllUser.moveToFirst())
	    {
	        do
	        {
	        	ArrayList<String> listGenreFav = new ArrayList<String>();
	    		ArrayList<Humain> listActeurFav = new ArrayList<Humain>();
	    		ArrayList<Humain> listRealisateurFav = new ArrayList<Humain>();
	    		ArrayList<Film> listFilmAVoir = new ArrayList<Film>();
	    		
	        	String prenomUser = cursorAllUser.getString(1);
				String nomUser = cursorAllUser.getString(2);
				String adresseUser = cursorAllUser.getString(0);
				String passwordUser = cursorAllUser.getString(5);
				String sexUser = cursorAllUser.getString(4);
				String[] listeAge = cursorAllUser.getString(3).split("-");
				int age = 2014 - Integer.parseInt(listeAge[0]);
				
				Cursor cursorActeurFav = app_db.rawQuery(selectActeurFav + adresseUser + "\"", null);
	            if(cursorActeurFav.moveToFirst())
	            	do
	            	{
	            		String nameActeurFav = cursorActeurFav.getString(0);
	            		String surnameActeurFav = cursorActeurFav.getString(1);
	            		if(mLibHumain.getHumain(nameActeurFav + "&" + surnameActeurFav) != null)
	            		{
	            			listActeurFav.add(mLibHumain.getHumain(nameActeurFav + "&" + surnameActeurFav));
	            		}
	            	} while(cursorActeurFav.moveToNext());
	            cursorActeurFav.close();
	            
	            Cursor cursorRealisateurFav = app_db.rawQuery(selectRealisateurFav + adresseUser + "\"", null);
	            if(cursorRealisateurFav.moveToFirst())
	            	do
	            	{
	            		String nameRealisateurFav = cursorRealisateurFav.getString(0);
	            		String surnameRealisateurFav = cursorRealisateurFav.getString(1);
	            		Humain realisateurFav = mLibHumain.getHumain(nameRealisateurFav + "&" + surnameRealisateurFav);
	            		if(realisateurFav != null)
	            		{
	            			listRealisateurFav.add(realisateurFav);
	            		}
	            	} while(cursorRealisateurFav.moveToNext());
	            cursorRealisateurFav.close();
	            
	            Cursor cursorGenreFav = app_db.rawQuery(selectGenreFav + adresseUser + "\"", null);
	            if(cursorGenreFav.moveToFirst())
	            	do
	            	{
	            		String genreFav = cursorGenreFav.getString(0);
	            		listGenreFav.add(genreFav);
	            	} while(cursorGenreFav.moveToNext());
	            cursorGenreFav.close();
	            
	            Cursor cursorFilmAVoir = app_db.rawQuery(selectFilmAVoir + adresseUser + "\"", null);
	            if(cursorFilmAVoir.moveToFirst())
	            	do
	            	{
	            		String nameFilmAVoir = cursorFilmAVoir.getString(0);
	            		for(int i = 0; i < mLibFilm.getListFilm().size(); i++)
	            		{
	            			if((mLibFilm.getListFilm().get(i).getNom()).equals(nameFilmAVoir))
	            			{
	            				listFilmAVoir.add(mLibFilm.getListFilm().get(i));
	            			}
	            		}
	            	} while(cursorFilmAVoir.moveToNext());
	            cursorFilmAVoir.close();
	            
	            utilisateur = new Utilisateur(nomUser, prenomUser, adresseUser, sexUser, passwordUser, 
	            								listActeurFav, listRealisateurFav, listGenreFav, listFilmAVoir,age);
	    		mLibUtilisateur.addUtilisateur(utilisateur);
	            
	        } while(cursorAllUser.moveToNext());
		}
		cursorAllUser.close();
	    
	    Object[] finalArray = new Object[3];
	    finalArray[0] = mLibFilm;
	    finalArray[1] = mLibHumain;
	    finalArray[2] = mLibUtilisateur;
		return finalArray;
	}
	
	// Retourne tous les utilisateur
//	public LibUtilisateur getAllUser()
//	{
//
//		user = new Utilisateur(nomUser, prenomUser, adresseUser, passwordUser);
//		mLib.addUtilisateur(user);
//
//		
//		return mLib;
//	}
	
	public LibCinema getAllCinema()
	{
		LibCinema mLib = new LibCinema();
		Cinema cinema;
		
		String name, adresse, movie, url, begin, end;
		float price2D, price3D;
		ArrayList<Projection> listProjection;
		Projection mProjection;
		
		String selectAllCinema = "SELECT * FROM Cinema";
		
		String selectInCinema = "SELECT Movie.name, InCinemas.BeginDate, InCinemas.EndDate FROM Cinema, Movie, InCinemas WHERE "
				+ "Cinema.name = InCinemas.cinema AND Movie.NameDirectorYear = InCinemas.Movie AND "
				+ "Cinema.name = \"";
		
		Cursor cursorAllCinema = app_db.rawQuery(selectAllCinema, null);
		if(cursorAllCinema.moveToFirst())
		{
			do
			{
				name = cursorAllCinema.getString(0);
				adresse = cursorAllCinema.getString(1);
				price2D = Math.round(cursorAllCinema.getFloat(4));
				price3D = Math.round(cursorAllCinema.getFloat(2));
				url = cursorAllCinema.getString(5);
        		listProjection = new ArrayList<Projection>();
				
				Cursor cursorProjection = app_db.rawQuery(selectInCinema + name + "\"", null);
	            if(cursorProjection.moveToFirst())
	            	do
	            	{
	            		movie = cursorProjection.getString(0);
	            		begin = cursorProjection.getString(1);
	            		end = cursorProjection.getString(2);
	            		Log.d("",movie + begin + end);
	            		mProjection = new Projection(begin, end, movie);
	            		listProjection.add(mProjection);
	            	} while(cursorProjection.moveToNext());
	            cursorProjection.close();
				
				cinema = new Cinema(adresse, name, false, price2D, price3D, listProjection, url);
				mLib.addCinema(cinema);
				
			} while(cursorAllCinema.moveToNext());
		}
		cursorAllCinema.close();
		
		return mLib;
	}
}